package com.java.yz.day08.ketang;

/*
    多态的好处：
        1.提高了程序的维护性（继承保证）
        2.提供了程序的扩展性（多态保证）
 */
class Animal2 {
    public void eat(){
        System.out.println("吃");
    }
    public void sleep(){
        System.out.println("睡");
    }
}
class Dog2 extends Animal2{
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
    @Override
    public void sleep(){
        System.out.println("狗睡觉");
    }
}
class Cat extends Animal2{
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }

    @Override
    public void sleep() {
        System.out.println("猫睡觉");
    }
}
class Pig extends Animal2{
    @Override
    public void eat() {
        System.out.println("猪吃饲料");
    }

    @Override
    public void sleep() {
        System.out.println("猪睡觉");
    }
}
//创建动物工具类
class AnimalTool{
    //工具类有前提：构造方法私有化
    private AnimalTool(){

    }
    public static void UseDog(Dog2 dog){
        dog.eat();
        dog.sleep();
    }
    public static void UseDCat(Cat cat){
        cat.eat();
        cat.sleep();
    }


    //使用多态进行修改
    public static void UseAnimal(Animal2 animal2){
        animal2.eat();   //而这里的pig传过来，就是   Animal2 animal2=new Pig（）；这不就是多态
        animal2.sleep();       //父类的引用指向子类，调用成员方法，编译看左，运行看右，用的还是子类的方法
    }
}


public class DuoTaiDemo3 {
    public static void main(String[] args) {
        Dog2 dog1 = new Dog2();
        dog1.eat();
        dog1.sleep();
        //这样就十分的麻烦，每次有一个新的动物的话就要自己重新写一个类，自己在调用方法
        //这是就可以引入封装，
        Dog2 dog2 = new Dog2();
        UseDog(dog2);  //这样每次就可以使用封装。但是这样还是显得本类十分的臃肿，可以自己定义一个工具类
    //我还想养好多动物，但是这样就要定义好多的类，好多的方法
        //创建的类是不可避免的，方法也会越来越多，
        //当方法越来越多的时候，这样就臃肿

        AnimalTool.UseDog(dog2);
        Cat cat = new Cat();
        AnimalTool.UseDCat(cat);
        //这样就给本类减去了许多的压力

        //假设现在要养一只猪，我们要自己创建一只猪的类，继承父类，重写方法，
        // 还要在AnimalTool中专门写一个调用猪的方法

        //但是这样子我们还有一个问题，但是我们每新加一个动物，就要在工具类修改，但是我们并不是希望别人修改的
        //这样就可以使用多态来解决

        Pig pig = new Pig();   //这个pig 就是这个 new Pig 的对象  ，
        AnimalTool.UseAnimal(pig);  //pig《==》new Pig

    }

    public static void UseDog(Dog2 dog){
        dog.eat();
        dog.sleep();
    }
}
